//
//  main.m
//  多态
//
//  Created by wenjim on 17/9/16.
//  Copyright © 2017年 WenJim. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Dog.h"

#import "Cat.h"

#import "Animal.h"

#import "Person.h"

#import "Pig.h"

int main(int argc, const char * argv[]) {
    
    /*
    Dog * dog = [Dog new];
    
    [dog eat];
    
    
    Cat * cat = [Cat new];
    
    [cat eat];
    */
    
    /*
    // 多态：事物的多种表现形态
    // 动态类型：在编译的时候编译器只会检查当前类型中有没有需要调用的方法
    //         在运行时，系统会自动判断an的真实类型
    Animal * an = [Dog new];
    
    [an eat];
    // 注意点：在多态中，如果想调用子类特有的方法必须强制类型转换为子类才能调用
//    [an kanjian];
    
    Dog * d1 = (Dog *)an;
    
    [d1 kanjian];
     
     */
    
    
    Dog * d = [Dog new];
    Cat * c = [Cat new];
    Pig * p = [Pig new];
    
    [Person food:d];
    [Person food:c];
    [Person food:p];
    
    /*
     什么是多态：
     事物的多种表现形态
     
     在程序中如何表现：
     父类指针指向子类对象
     
     优点：
     提高了代码的扩展行
     
     注意点：
     如果父类指针指向子类对象，如果需要调用子类特有的方法，必须先强制类型转换为子类才能调用
     
     */
    
    
    
    return 0;
}
